<%@ page contentType="image/jpeg;charset=UTF-8" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
<%-- JSP验证码 --%>
<%
    //设置页面不缓存
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0);

    // 在内存中创建图象
    int width = 108, height = 34;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    // 获取图形上下文
    Graphics2D g = image.createGraphics();

    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
    // 图形抗锯齿
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    // 字体抗锯齿
    g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

    // 设定背景色
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, width, height);

    //设定字体
    g.setFont(new Font(Font.MONOSPACED, Font.BOLD, 40));

    //生成随机类
    Random random = new Random();

    // 取随机产生的认证码(4位数字)
    String sRand = "";
    for (int i=0;i<4;i++){
        String rand=String.valueOf(random.nextInt(10));
        sRand += rand;
        // 将认证码显示到图象中
        //调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成
        g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110) ,20+random.nextInt(110)));
        g.drawString(rand, 22 * i + 6, 30);
    }

    // 将认证码存入SESSION 
    session.setAttribute("rand", sRand);

    // 图象生效
    g.dispose();

    // 输出图象到页面
    ImageIO.write(image, "JPEG", response.getOutputStream());
    image.flush();

    //清空缓存的内容。
    out.clear();
    //返回一个新的BodyContent(代表一个HTML页面的BODY部分内容）
    //保存JspWriter实例的对象out
    //更新PageContext的out属性的内容
    out = pageContext.pushBody();
%>